import { createComponentAttr } from '@/libs/edit'
/**
 * 获取扁平化的控件列表 (以控件id为key)
 * @param {Array} widgetList 控件列表
 * @param {Function} callback 回调函数(遍历时的控件数据)
 * @returns {
 *   控件ID: { 控件数据, 控件索引, 父级控件Id, 父级内容, 是否是自由子控件 }
 *   widgetId: { widgetData, widgetIndex, parentId, parentContent, isFreeWidget }
 * }
 */
const getWidgetListFlat = (widgetList = [], callback) => {
    const widgetsFlat = {}
    const forWidgets = (id, widgets) => {
        for (let index = 0; index < widgets.length; index++) {
            const widget = widgets[index]
            // 判断是控件数据
            if (!widget.hasOwnProperty('eles') || !widget.hasOwnProperty('component')) {
                continue
            }
            // 判断控件ID为空，则赋值ID值
            if (!widget.eles.id) {
                createComponentAttr(widget)
            }
            
            const widgetId = widget.eles.id
            if (!!widgetsFlat[widgetId]) console.warn(`存在重复控件ID-${widgetId}`)
            widgetsFlat[widgetId] = {
                widgetData: widget,      // 控件数据
                widgetIndex: index,     // 控件索引
                parentId: id,           // 父控件ID
                parentContent: widgets, // 父级内容
                isFreeWidget: widget.eles?.style?.position === 'absolute' // 是否是自由子控件
            }

            // 兼容处理一些旧的控件类型，后期可删除
            switch (widget.eles.type) {
                // case 'oldType':
                //     widget.eles.type = 'newType'
                //     break;
            }

            if (Object.prototype.toString.call(callback) === '[object Function]') {
                callback(widget)
            }
            forWidgetObject(widgetId, widget)
        }
    }
    const forWidgetObject = (widgetId, widget) => {
        for (const key of Object.keys(widget)) {
            const value = widget[key]
            if (Object.prototype.toString.call(value) === '[object Object]') {
                forWidgetObject(widgetId, value)
            }
            if (Object.prototype.toString.call(value) === '[object Array]') {
                if (value.some(item => (Object.prototype.toString.call(item) === '[object Object]') && item.hasOwnProperty('eles'))) {
                    forWidgets(widgetId, value)
                } else {
                    forWidgetObject(widgetId, value)
                }
            }
        }
    }
    // 开始遍历控件列表
    forWidgets(null, widgetList)
    return widgetsFlat
}

export default getWidgetListFlat